#include <my_header.h>

/* Usage: ./6_POSIX */
int main(int argc, char *argv[]){
    // "/test" 可以不存在
    int shm_fd = shm_open("/test", O_CREAT |O_RDWR,
                          0666);
    ERROR_CHECK(shm_fd, -1, "shm_open");
    // 提前获取共享内存大小
    ftruncate(shm_fd, 4096);

    void *ptr = mmap(0, 4096, PROT_READ | PROT_WRITE,
                     MAP_SHARED, shm_fd, 0);

    if(fork() == 0)
    {   
        sprintf((char *) ptr, "Hello from child!");

    }else{
        wait(NULL); // 阻塞 等待清理子进程资源
        printf("shared memory:%s\n", (char *) ptr);
    }

    // 销毁映射表
    munmap(ptr, 4096);
    shm_unlink("/test");
    return 0;
}

#if 0
ps2:shm_open 函数的第一个参数是一个POSIX共享内存对象的名
字，而不是文件系统上的一个路径，而是一个标识符，应该以/开头
的名字，用于创建和引用共享内存对象。
(这和ftok是不同的)

1.使用 shm_open 创建一个新的或打开一个共享内存对象。
2.使用 ftruncate 设置共享内存对象的大小。
3.使用 mmap 将共享内存映射到进程的地址空间。
4. 通过 fork 创建一个新的进程。
5.在子进程中，向共享内存写入数据。
6.在父进程中，等待子进程结束后，从共享内存读取数据。
7.使用 munmap 解除映射。
8.使用 shm_unlink 删除共享内存对象。
#endif

